home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
falcon
/
programm.ing
/
falclib2.lzh
/
ROUTS
/
GORAUD.S
< prev
next >
Wrap
Text File
|
1994-08-11
|
6KB
|
296 lines
*
* GORAUD.S
*
* @goraud
*
* Draw a goraud shaded polygon in true colour.
* There's no clipping so don't draw too large polygons.
*
* In a1.l=screenadr
* a2.l=adr to colourtable
* new_crds=following table: [x,y,i]*nbr_of_points
* d6.w=nbr. of points
* xres equ horizontal resolution
* (destroys a lot)
*
* The colourtable consists of 32 words, each a true colour value.
* word nr 0 is the darkest and word nr 31 the brightest. This is
* followed by 16 empty words.
* Supplied colours: g_lightred, g_green, g_brown, g_white
* new_crds is a table that consist of a pair of coordinates followed
* by a brightnes factor. The brightnes factor is a number between 0
* and #$7fff.
*
* ex. xres equ 384 overscaned lowres screen
* bsr @initgoraud call once only
*
* move.l scradr,a1 screenaddress
* move.l #g_red,a2 I want a red poly
* moveq #4,d6 four points
* bsr @goraud draw it
*
* new_crds dc.w 10,10,0 a dark point
* dc.w 200,20,$7fff a bright point
* dc.w 140,140,$7fff/2
* dc.w 25,50,$7fff/4
*
*
* @initgoraud
* This subroutine must be called once before using '@goraud'.
*
@goraud
lea offsets,a0
move.l a1,workscr2354
move.l a2,colouradr2354
bsr GDraw_Poly
rts
colouradr2354 ds.l 1
offsets dc.w 0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,100
;-----------------------------------------------------------------------;
; Gouraud Shaded Polygon Routine. ;
; A0 -> D6 coords (offsets into 'new_crds' in form X,Y,INTENSITY CONST) ;
;-----------------------------------------------------------------------;
GDraw_Poly LEA trans_crds,A1
LEA new_crds,A6
MOVE D6,D0
ADD D6,D6
ADD D0,D6
ADD D6,D6 6*d6
MOVE.L A1,A5
ADDA.W D6,A5
MOVE.L A5,A2
ADDA.W D6,A2
Init_coords SUBQ #2,D0
MOVE.W (A0)+,D7
MOVE.W 4(A6,D7),D5
MOVE.L (A6,D7),D7
MOVE D7,D2
MOVE.L A5,A4
MOVE.L D7,(A1)+ ; dup first coord
MOVE.W D5,(A1)+
MOVE.L D7,(A2)+
MOVE.W D5,(A2)+
MOVE.L D7,(A5)+
MOVE.W D5,(A5)+
.coord_lp MOVE.W (A0)+,D3
MOVE.W 4(A6,D3),D5
MOVE.L (A6,D3),D3
CMP D2,D3
BGE.S .not_top
MOVE D3,D2
MOVE.L A5,A4
.not_top CMP D3,D7
BGE.S .not_bot
MOVE D3,D7
.not_bot MOVE.L D3,(A1)+ ; dup for rest
MOVE.W D5,(A1)+
MOVE.L D3,(A2)+
MOVE.W D5,(A2)+
MOVE.L D3,(A5)+
MOVE.W D5,(A5)+
DBF D0,.coord_lp
MOVE.L A0,USP
MOVE.L A4,A5
SUB D2,D7 ;d2 - lowest y d7 - greatest y
BEQ polydone
MOVE D2,-(SP)
MOVE D7,-(SP)
CALCS LEA grad_table+640(PC),A0
; Calc x's down left side of poly
Do_left LEA LEFTJMP(PC),A2
LEA x1s(PC),A3
Left_lp SUBQ #6,A4
MOVEM.W (A4),D1-D2 ;x1,y1
MOVEM.W 4(A4),D0/D3-D5 ;I2,x2,y2,I1
SUB D4,D2 ;dy
SUB D3,D1 ;dx
SUB D2,D7 ;remaining lines-dy
SUB D5,D0 ;DI
EXT.L D0
DIVS D2,D0
ADD.W D2,D2
MULS (A0,D2),D1
ADD.L D1,D1
MOVE.W D1,D4 ; frac part
SWAP D1 ; whole part
MOVE.W D2,D6
ADD D2,D2
ADD D2,D2
ADD D6,D2 ; *10
NEG D2
CLR.W D6
JMP (A2,D2)
REPT 200
MOVE.W D3,(A3)+
ADD.W D4,D6
ADDX.W D1,D3
MOVE.W D5,(A3)+
ADD.W D0,D5
ENDR
LEFTJMP TST D7
BGT Left_lp
; Calc x's down right side of poly
Do_right MOVE.W (SP),D7
LEA RIGHTJMP(PC),A2
LEA x2s(PC),A3
Right_lp MOVEM.W (A5)+,D1-D2/D5 ;x1,y1,I2
MOVEM.W (A5),D3-D4/D6 ;x2,y2,I1
SUB D2,D4 ;dy
SUB D1,D3 ;dx
SUB D4,D7 ;remaining lines-dy
SUB D5,D6 ;DI
EXT.L D6
DIVS D4,D6
ADD.W D4,D4
MULS (A0,D4),D3
ADD.L D3,D3
MOVE.W D3,D2 ; frac part
SWAP D3 ; whole part
MOVE.W D4,D0
ADD D4,D4
ADD D4,D4
ADD D0,D4 ; *10
NEG D4
CLR.W D0
JMP (A2,D4)
REPT 200
MOVE.W D1,(A3)+
ADD.W D2,D0
ADDX.W D3,D1
MOVE.W D5,(A3)+
ADD.W D6,D5
ENDR
RIGHTJMP TST D7
BGT Right_lp
; Now draw on screen
.gofordraw MOVE (SP)+,D7 ; DY
MOVE (SP)+,D0 ; MIN Y
SUBQ #1,D7
move.l colouradr2354,a5
MOVE.L workscr2354(PC),A6
MULU #xres*2,D0
ADDA.L D0,A6
LEA x1s(PC),A1
LEA x2s(PC),A2
MOVEQ #16-6,D3
MOVE.W #xres*2,D4
MOVEQ #0,D5
Gdraw_lp MOVE.W (A1)+,D0 ; x1
MOVE.W (A2)+,D6 ; x2
MOVE.W (A1)+,D1 ; Intensity 1
MOVE.W (A2)+,D2 ; Intensity 2
EXT.L D1
EXT.L D2
LEA (A6,D0.W*2),A0
SUB.W D0,D6
BLE DS2
SUB.L D1,D2
EXT.L D6
SWAP D2
DIVS.L D6,D2
ASR.L D3,d2
ASL.L #6,D1
SWAP D1
SWAP D2
MOVEQ #31,D0
AND.W D6,D0
LSR.W #5,D6
MOVE D5,CCR
JMP ([jmptab,D0.W*4])
Glp
REPT 32
MOVE.W (A5,D1*2),(A0)+
ADDX.L D2,D1
ENDR
g_jmp DBF D6,Glp
DS2 ADD.W D4,A6
DBF D7,Gdraw_lp
polydone RTS
i SET 0
jmptab
REPT 32
DC.L g_jmp+i
i SET i-6
ENDR
DS.W 16
; Create Multplication gradient table for poly edges
@initgoraud LEA grad_table(PC),A0
MOVE #-320,D0
.lp1 MOVE.L #32768,D1
DIVS D0,D1
MOVE.W D1,(A0)+
ADDQ #1,D0
CMP #-1,D0
BNE.S .lp1
MOVE.W #-32768,(A0)+
MOVE.W #0,(A0)+
MOVE.W #32767,(A0)+
MOVEQ #2,D0
.lp2 MOVE.L #32768,D1
DIVS D0,D1
MOVE.W D1,(A0)+
ADDQ #1,D0
CMP #321,D0
BNE.S .lp2
RTS
grad_table ds.w 642
x1s DS.L 201
x2s DS.L 201
trans_crds DS.W 200
workscr2354 ds.l 1
g_lightred
i set 0
rept 32
dc.w (31*32*64)+(i*64)+(i)
i set i+1
endr
ds.w 16
g_green
i set 0
rept 32
dc.w (1*32*64)+(i*64)+(1)
i set i+1
endr
ds.w 16
g_white
i set 0
rept 32
dc.w (i*32*64)+(i*64)+(i)
i set i+1
endr
ds.w 16
g_brown
i set 0
rept 32
dc.w (i*32*64)+((i/2)*64)+(2)
i set i+1
endr
ds.w 16